<?php
namespace app\apisell\controller\xcx;

use app\BaseController;
use app\common\utils\Res;
use app\common\utils\SmsHelper;
use Exception;
use think\db\exception\DbException;
use think\facade\Cache;
use think\facade\Db;

/**
 * 用户地址管理
 */
class Address extends BaseController
{
    /**
     * 获取用户地址列表
     *
     * 本函数通过用户ID获取该用户的地址列表它首先从请求中获取用户ID参数，
     * 检查用户ID是否为0，因为0不是有效的用户ID如果用户ID有效，则从数据库中查询对应的用户地址列表，
     * 并返回查询结果如果用户ID无效，则返回错误信息
     *
     * @return mixed 返回地址列表或错误信息
     */
    public function getUserAddressList()
    {
        // 从POST请求中获取参数
        $param = $this->request->post();
        // 提取用户ID参数
       // $userId = $param['user_id'];
        $userId =  $this->request->id;//获取用户id

        // 检查用户ID是否为空
        if ($userId == 0){
            // 如果用户ID为空，返回错误信息
            return Res::error('UserId cannot be empty');
        }
    
        // 从数据库中查询用户地址列表
        $list = Db::table('xh_sell_user_address')->where('user_id',$userId)->select();
    
        // 返回成功信息和用户地址列表
        return Res::ok($list);
    }
    /**
     * 设置默认地址
     * @return \think\response\Json
     * @throws \think\db\exception\DbException
     */
    public function SettingsAddress()
    {
        $param = $this->request->post();
        $id = $param['id'];
        $type = $param['type'];
        if ($type == 1){//默认地址
            try {
                $sendState = Db::table('xh_sell_user_address')->where('id','<>',$id)->update(['state'=>0]);
            } catch (Exception $e) {
                return Res::error('Set Failed');
            }
            $sendState = Db::table('xh_sell_user_address')->where('id',$id)->update(['state'=>1]);
            return Res::ok('Set Success');
        }else{
            $sendState = Db::table('xh_sell_user_address')->where('id',$id)->update(['state'=>0]);
            return Res::ok('Set Success');
        }
    }
    /**
     * 添加用户地址
     * 
     * 此方法用于添加一个新的用户地址它允许在用户的地址列表中添加一个地址，
     * 可以用于后续的地理位置相关功能，比如定位服务或者地址信息展示
     *
     */
    public function addUserAddress()
    {
        // 获取请求参数
        $param = $this->request->post();
        $userId =  $this->request->id;//获取用户id
        $nickname =   $this->request->nickname;
        $resCode = $param['code'];

        if (empty($userId)) {
            return Res::error('登录超时，请重新登录');
        }
        
        // 获取缓存中的验证码
        $code = Cache::get('promoter_code');

        // 验证验证码是否正确
        if ($resCode != $code[0]) {
            return Res::error('验证码错误');
        }

        //判断 手机号是否存在
        $phone = Db::table('xh_sell_user')->where('id', $userId)->value('phone');
        if (empty($phone)){
            Db::table('xh_sell_user')->where('id', $userId)->update(['phone'=>$param['mobile']]);
        }

        $userInfo = Db::table('xh_sell_user_address')->where('user_id', $userId)->find();
        
        if (!empty($userInfo)) {
            return Res::ok($userInfo);
        }

        try {
            // 定义数据数组
            $addressData = [
                'user_id' => $userId,
                'name' => $param['name'] ?? $nickname,
                'mobile' => $param['mobile'],
                'province_code' => $param['province_code'] ?? '330000',
                'city_code' => $param['city_code'] ?? '330100',
                'area_code' => $param['area_code'] ?? '330108',
                'province' => $param['provinceName'] ?? '浙江省',
                'city' => $param['cityName'] ?? '杭州市',
                'area' => $param['districtName'] ?? '滨江区',
                'address' => $param['address'] ?? '西兴街道星耀中心1号楼',
                'state' => 1,
                'create_time' => date('Y-m-d H:i:s', time())
            ];
            
            Db::startTrans();  // 开始事务
            
            //Db::table('xh_sell_user_address')->where('user_id', $userId)->update(['state' => 0]);
            Db::table('xh_sell_user_address')->insert($addressData);
            
            
            Db::commit();  // 提交事务
            
            return Res::ok('Add successfully');
        } catch (Exception $e) {
            Db::rollBack();  // 回滚事务
            // 记录异常日志
            Db::table('xh_sell_sync_order_1_log')->insert([
                'order_type'=>2,
                'info'=>$e->getMessage().'行号：'.$e->getLine() . '文件：'.$e->getFile(),
                'info_'=>'创建地址失败',
                'create_time'=>date('Y-m-d H:i:s')
            ]);
            return Res::error('创建地址失败');
        }
        
    }
    /**
     * 修改用户收货地址
     *
     * 此方法用于更新用户收货地址信息，通过POST请求接收前端传来的参数，
     * 包括用户ID、姓名、电话和地址等信息。在更新地址信息之前，
     * 会检查用户ID是否为空，如果为空则返回错误信息。接着使用数据库事务
     * 来确保地址更新操作的完整性。如果更新成功，返回成功信息；否则，返回失败信息。
     * 如果在事务处理过程中发生异常，会回滚事务并记录错误日志。
     */
    public function editUserAddress()
    {
        // 接收POST请求参数
        $param = $this->request->post();
       
        // 提取参数中的ID
        $id = $param['id'];
        // 准备更新的数据
        $data['name'] = $param['name'];
        $data['mobile'] = $param['mobile'];
        $data['province_code'] = $param['province_code'];
        $data['city_code'] = $param['city_code'];
        $data['area_code'] = $param['area_code'];
        $data['province'] = $param['provinceName'];
        $data['city'] = $param['cityName'];
        $data['area'] = $param['districtName'];
        $data['address'] = $param['address'];
        // 记录更新时间
        $data['update_time'] = date('Y-m-d H:i:s',time());
        
        // 开始事务
        Db::startTrans();
        try {
            // 更新用户收货地址信息
            $stmt = Db::table('xh_sell_user_address')->where('id',$id)->update($data);
            // 提交事务
            Db::commit();
            // 根据更新结果返回相应信息
            return Res::ok('Edit successfully');
        } catch (Exception $e) {
            // 发生错误回滚事务
            Db::rollBack();
            // 记录错误日志
            error_log($e->getMessage());
            // 抛出异常，提示无法接收用户收货地址信息
            return Res::error('编辑地址失败');

        }
    }
    /**
     * 删除用户收货地址信息
     * 此方法用于处理用户收货地址的删除请求通过接收POST请求参数中的地址ID，
     * 在数据库中删除对应的用户收货地址信息如果删除成功，返回成功信息；
     * 如果删除失败，返回失败信息在删除过程中，如果发生任何异常，将回滚数据库操作，
     * 并记录错误日志同时，抛出一个自定义的异常，提示无法删除用户收货地址信息
     */
    public function deleteUserAddress()
    {
        // 接收POST请求参数
        $param = $this->request->post();
        $id = $param['id'];
        // 开始事务
        Db::startTrans();
        try {
            // 删除用户收货地址信息
            $stmt = Db::table('xh_sell_user_address')->where('id',$id)->delete();
            // 提交事务
            Db::commit();
            // 根据删除结果返回相应信息
            return Res::ok('Delete successfully');
        } catch (Exception $e) {
            // 发生错误回滚事务
            Db::rollBack();
            // 记录错误日志
            error_log($e->getMessage());
            // 抛出异常，提示无法接收用户收货地址信息
            return Res::error('删除地址失败');
        }
    }
    public function getUserAddressPhone()
    {
        $param = $this->request->post();
        try {
            if (!isset($param['mobile'])) {
                return Res::error('请输入手机号');
            }
            $phone = [$param['mobile']];
            $code[] =  str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
            $captchaCode = SmsHelper::sendCaptchaSms($phone,$code);
            Db::table('xh_sell_sync_order_1_log')->insert([
                'info' => json_encode($captchaCode),
                'info_' => '发送短信验证码成功：code'.$code[0].'手机号：'.$param['mobile'],
                'create_time' => date('Y-m-d H:i:s')
            ]);
            if($captchaCode['Code'] == 'OK'){
                Cache::set('promoter_code',$code,600);
                return Res::ok($code[0]);
            }else{
                return Res::error('发送失败');
            }
        } catch (\Exception $e) {
            // 记录异常日志
            Db::table('xh_sell_sync_order_1_log')->insert([
                'info' => $e->getMessage().'行号：'.$e->getLine() . '文件：'.$e->getFile() . '文件栈：' . $e->getTraceAsString(),
                'info_' => '发送短信验证码失败：code'.$code[0].'手机号：'.$param['mobile'],
                'create_time' => date('Y-m-d H:i:s')
            ]);
        }
    }
}
